package com.rgc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

import com.rgc.domain.Equipo;
import com.rgc.domain.EquipoUsuario;


public class EquipoDaoImpl extends JdbcDaoSupport implements EquipoDao {

	public boolean addEquipo(final Equipo equipo, final String idusuarioLider) {
		try {
			KeyHolder keyHolder = new GeneratedKeyHolder(); 
			final String sql = "INSERT INTO equipo(nombre,urlimagen) values(?,?)";
			getJdbcTemplate().update(
					new PreparedStatementCreator()
			        {
			            public PreparedStatement createPreparedStatement(Connection conn) throws SQLException
			            {
			                PreparedStatement preparedStatement = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			                preparedStatement.setString(1,equipo.getNombre());
			                preparedStatement.setString(2,equipo.getUrlimagen());
			                return preparedStatement;
			            }
			        },keyHolder	
					);		
			final int idequipo = keyHolder.getKey().intValue();
			if(idequipo>0){
				final String sql2 = "INSERT INTO equipo_usuario(idusuario,idequipo,nivel) values(?,?,?)";
				getJdbcTemplate().update(
						new PreparedStatementCreator()
				        {
				            public PreparedStatement createPreparedStatement(Connection conn) throws SQLException
				            {
				                PreparedStatement preparedStatement = conn.prepareStatement(sql2, Statement.RETURN_GENERATED_KEYS);
				                preparedStatement.setString(1,idusuarioLider);
				                preparedStatement.setInt(2,idequipo);
				                preparedStatement.setInt(3,2);
				                return preparedStatement;
				            }
				        });	
				return true;
			}
           
         
        } catch (Exception e) {
                System.out.println("INSEREQUIPO!!!!"+e.getMessage());
                e.printStackTrace();
        }
		return false;
		
	}

	public boolean delEquipo(String idequipo) {
		try{
			String sql = "UPDATE equipo set estado=0 where idequipo='"+idequipo+"' ";
			getJdbcTemplate().update(sql);
			
			sql = "DELETE from equipo_usuario where idequipo='"+idequipo+"' ";
			getJdbcTemplate().update(sql);
			
			return true;
			
		}catch(Exception e){
			
		}
		return false;
	}

	public boolean modEquipo(Equipo equipo) {
		try{
			String sql = "UPDATE equipo set nombre='"+equipo.getNombre()+"',urlimagen='"+equipo.getUrlimagen()+"' where idequipo='"+equipo.getIdequipo()+"' ";
			System.out.println(sql);
			getJdbcTemplate().update(sql);
			return true;
			
		}catch(Exception e){
		e.printStackTrace();	
		}
		return false;

	}

	public boolean addEquipoUsuario(final String idusuario,final String idequipo,final String nivel) {
		try {
			
			final String sql2 = "INSERT INTO equipo_usuario(idusuario,idequipo,nivel) values(?,?,?)";
			getJdbcTemplate().update(
					new PreparedStatementCreator()
			        {
			            public PreparedStatement createPreparedStatement(Connection conn) throws SQLException
			            {
			                PreparedStatement preparedStatement = conn.prepareStatement(sql2, Statement.RETURN_GENERATED_KEYS);
			                preparedStatement.setString(1,idusuario);
			                preparedStatement.setString(2,idequipo);
			                preparedStatement.setString(3,nivel);
			                return preparedStatement;
			            }
			        });	
			return true;

        } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
        }
		return false;

	}

	public List<Equipo> listEquipo(String[] campo, String[] valor) {
		try {
			String sql = " SELECT * from equipo  ";
			String conector=" where ";
			for (int i=0;i<campo.length;i++)  {
				 sql+=conector+""+campo[i]+"='"+valor[i]+"'";
				 conector=" and ";
						 
		    }
			sql+=conector+"  estado=1  "+" order by idequipo";
		
				List<Equipo> found =  getJdbcTemplate().query(
		    			sql, new BeanPropertyRowMapper<Equipo>(Equipo.class));

		    	return found;
		    	
		} catch (Exception e) {
		        System.out.println(e.getMessage());
		        e.printStackTrace();
		}
		return new ArrayList<Equipo>();
	}

	public List<Equipo> listEquipo() {
		return listEquipo(new String[]{},new String[]{});
	}

	public String foundUsuarioLevel(String idusuario,String idequipo) {	
		List<EquipoUsuario> usuario=listEquipoUsuario(idequipo);
		if(usuario.size()>0){
			for(EquipoUsuario user : usuario)
				if(user.getIdusuario().equals(idusuario))
					return user.getNivel() ;
			
		}
		return null;	
	}

	public Equipo foundEquipo(String idusuario){
		try {
			String sql = " SELECT b.* from equipo_usuario a,equipo b  "+
						 " where a.idusuario='"+idusuario+"' and a.idequipo=b.idequipo and "
						+"  b.estado=1  "+" and a.nivel>0 order by a.idusuario";
			List<Equipo> foundEquipo =  getJdbcTemplate().query(sql, new BeanPropertyRowMapper<Equipo>(Equipo.class));
			sql = " SELECT * from equipo_usuario a  where a.idusuario='"+idusuario+"' and a.nivel>0 ";
		    List<EquipoUsuario> foundEquipoUsuario =  getJdbcTemplate().query(sql, new BeanPropertyRowMapper<EquipoUsuario>(EquipoUsuario.class));	
			
		    if(foundEquipo.size()>0){
		    	Equipo newEquipo=foundEquipo.get(0);
		    	if(foundEquipoUsuario.size()>0)	
		    		newEquipo.setEquipousuario(foundEquipoUsuario);
		    	else
		    		newEquipo.setEquipousuario(new ArrayList<EquipoUsuario>());
		        return newEquipo;
		    }    
		  
		} catch (Exception e) {
		        System.out.println(e.getMessage());
		        e.printStackTrace();
		}
		return null;
	}
	
	public List<EquipoUsuario> listEquipoUsuario(String idequipo) {
		try {
			String sql = " SELECT a.*, b.username from equipo_usuario a,usuario b  "+
						 " where a.idequipo='"+idequipo+"' and a.idusuario=b.idusuario and "
						+"  b.estado=1  "+" and a.nivel>0 order by nivel desc";
		
				List<EquipoUsuario> found =  getJdbcTemplate().query(
		    			sql, new BeanPropertyRowMapper<EquipoUsuario>(EquipoUsuario.class));

		    	return found;
		    	
		} catch (Exception e) {
		        System.out.println(e.getMessage());
		        e.printStackTrace();
		}
		return new ArrayList<EquipoUsuario>();
	}

	
	public boolean delEquipoUsuario(String idusuario, String idequipo) {
		
		try{
			String sql = "DELETE FROM equipo_usuario  where idequipo='"+idequipo+"' and idusuario='"+idusuario+"' ";
			getJdbcTemplate().update(sql);
			
			return true;	
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	
public boolean delEquipoUsuario(String idusuario) {
		
		try{
			String sql = "DELETE FROM equipo_usuario  where idusuario='"+idusuario+"' ";
			getJdbcTemplate().update(sql);
			return true;	
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}

public boolean AceptarEquipoUsuario(String idusuario,String idequipo) {
	
	try{
		String sql = "UPDATE  equipo_usuario set nivel=1 where idusuario='"+idusuario+"' and idequipo='"+idequipo+"' ";
		getJdbcTemplate().update(sql);
		
		sql = "DELETE FROM equipo_usuario  where idusuario='"+idusuario+"' and nivel=0 ";
		getJdbcTemplate().update(sql);
		return true;	
	}catch(Exception e){
		e.printStackTrace();
	}
	return false;
}

	public List<Equipo> solicitudes(String idusuario) {
		try{
			String sql="select * from equipo_usuario a,equipo b where a.idusuario='"+idusuario+"' and a.idequipo=b.idequipo and b.estado=1 and a.nivel=0 ";
			System.out.println("SOLICITUDES:"+sql);
			List<Equipo> found =  getJdbcTemplate().query(sql, new BeanPropertyRowMapper<Equipo>(Equipo.class));
			return found;
		}catch(Exception e){
			
		}
		return new ArrayList<Equipo>();
		
	}

	public Equipo getEquipo(String idequipo) {
		List<Equipo> equipo=listEquipo(new String[]{"idequipo"},new String[]{idequipo});
		if(equipo.size()>0)
			return equipo.get(0);
		return null;
	}

	
	
	
	

	

}
